﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using XRM.Security.DataAccess.Enums;
using XRM.Security.DataAccess.Helpers;
using XRM.Security.WebUI.Models.IdentityCenter;
using XRM.Security.WebUI.Models.InfoSystem;
using XRM.Security.WebUI.Models.UserRegister;
using db = XRM.Security.DataAccess.Models;

namespace XRM.Security.WebUI.Models.Request
{
    public class RequestCertModel : BaseViewModel
    {
        public RequestCertModel()
        {
            InfoSystemList = new List<InfoSystemModel>();
        }

        public RequestCertModel( db.RequestCert dbEntity )
        {
            InfoSystemList = new List<InfoSystemModel>();

            if ( dbEntity != null )
            {
                Id = dbEntity.RequestCertId;
                FileName = dbEntity.FileName;

                UserRegisterId = dbEntity.UserRegisterId;
                //CertUser = new UserRegisterModel( dbEntity.UserRegister );
                //CertUser.PCList.Insert( 0, new PCModel { Id = -1, PCHost = "(Выберите серийный номер ПК)" } );
                GetCertUser(dbEntity.UserRegister);

                IdentityCenterId = dbEntity.IdentityCenterId;
                CertIdentityCenter = new IdentityCenterModel( dbEntity.IdentityCenter );
                PCId = dbEntity.PCId;
                CertPC = new PCModel( dbEntity.PC );

                UploadDate = dbEntity.UploadDate;
                FromDate = dbEntity.FromDate;
                ToDate = dbEntity.ToDate;
                Status = dbEntity.Status();

                SerialNumber = dbEntity.SerialNumber;
                SerialNumberEtoken = dbEntity.SerialNumberEtoken;
                Thumbprint = dbEntity.Thumbprint;

                if ( dbEntity.RequestCertInfoSystems != null && dbEntity.RequestCertInfoSystems.Any() )
                {
                    foreach ( db.RequestCertInfoSystem item in dbEntity.RequestCertInfoSystems )
                    {
                        InfoSystemList.Add( new InfoSystemModel( item.InfoSystem ) );
                    }
                }
            }
        }

        public void GetCertUser( db.UserRegister user )
        {
            CertUser = user != null ? new UserRegisterModel( user ) : new UserRegisterModel();
            CertUser.PCList.Insert(0, new PCModel { Id = -1, SerialNumber = "(Выберите серийный номер ПК)" });
            CertUser.InfoSystemList = CertUser.InfoSystemList.Where( x => !x.RevokeDate.HasValue ).OrderBy( x => x.InfoSystem.InfoSystemName ).ToList();
            CertUser.InfoSystemList.Insert( 0, new UserInfoSystemModel { Id = -1, InfoSystem = new InfoSystemModel { Id = -1, InfoSystemName = "(Выберите информационную систему)" } } );
        }

        public void GetIdentityCenter( db.IdentityCenter ic )
        {
            CertIdentityCenter = new IdentityCenterModel( ic );
        }

        [Display( Name = "Имя файла" )]
        [Required( ErrorMessage = "Поле 'Имя файла' обязательное" )]
        [MaxLength( 255, ErrorMessage = "Максимальная длина поля 'Сертификат' 255 символов" )]
        public string FileName { get; set; }

        [Display( Name = "Пользователь" )]
        [Required( ErrorMessage = "Поле 'Пользователь' обязательное" )]
        public int UserRegisterId { get; set; }
        public UserRegisterModel CertUser { get; set; }


        [Display( Name = "Удостоверяющий центр" )]
        [Required( ErrorMessage = "Поле 'Удостоверяющий центр' обязательное" )]
        public int IdentityCenterId { get; set; }
        public IdentityCenterModel CertIdentityCenter { get; set; }

        [Display( Name = "Серийный номер ПК" )]
        public int? PCId { get; set; }
        public PCModel CertPC { get; set; }

        [Display( Name = "Серийный номер сертификата" )]
        [Required( ErrorMessage = "Поле 'Серийный номер' обязательное" )]
        [MaxLength( 50, ErrorMessage = "Максимальная длина поля 'Серийный номер' 50 символов" )]
        public string SerialNumber { get; set; }

        [Display( Name = "Серийный номер etoken" )]
        [MaxLength( 50, ErrorMessage = "Максимальная длина поля 'Серийный номер etoken' 50 символов" )]
        public string SerialNumberEtoken { get; set; }

        [Display( Name = "Отпечаток" )]
        [Required( ErrorMessage = "Поле 'Отпечаток' обязательное" )]
        [MaxLength( 50, ErrorMessage = "Максимальная длина поля 'Отпечаток' 50 символов" )]
        public string Thumbprint { get; set; }

        public DateTime UploadDate { get; set; }
        public DateTime FromDate { get; set; }
        public DateTime ToDate { get; set; }
        public CertStatus Status { get; set; }

        [Display( Name = "Срок действия" )]
        public string ValidPeriod
        {
            get
            {
                return FromDate.ToString( "dd.MM.yyyy" ) + " - " + ToDate.ToString( "dd.MM.yyyy" );
            }
        }
        [Display( Name = "Статус сертификата" )]
        public string StatusCaption
        {
            get
            {
                return Status.Description();
            }
        }

        [Display( Name = "Информационные системы" )]
        public List<InfoSystemModel> InfoSystemList { get; set; }

        public string InfoSystemsColumnData
        {
            get
            {
                if ( InfoSystemList.Any() )
                    return InfoSystemList.Select( i => i.InfoSystemName ).ToList().Aggregate( ( current, next ) => current + "<br/>" + next );
                else
                    return "";
            }
        }

        public byte[] FileData { get; set; }

        public bool IsFromUser { get; set; }

        public IEnumerable<ValidationResult> Validate( ValidationContext validationContext )
        {
            yield break;
        }
    }
}